package com.yxzc.chapter18.lowerbounds

//
//1）和Animal直系的，是Animal父类的还是父类处理，是Animal子类的按照Animal处理() 如果方法覆盖是按照子类的方法来执行，
//2）和Animal无关的，一律按照Object处理！
object LowerBoundsDemo01 {
  def main(args: Array[String]): Unit = {
    println("ok!")
    //满足下界的约束
    biophony(Seq(new Earth, new Earth)).map(_.sound())
    //满足下界的约束
    biophony(Seq(new Animal, new Animal)).map(_.sound())

    //这里我们不能使用上界的思路去推导，这里是可以运行
    //1.?
    println("===================")
    biophony(Seq(new Bird, new Bird)).map(_.sound())//

    //biophony(Seq(new Moon))

  }
  //下界
  def biophony[T >: Animal](things: Seq[T]) = things
}


class Earth { //Earth 类
  def sound(){ //方法
    println("hello !")
  }
}
class Animal extends Earth{
  override def sound() ={ //重写了Earth的方法sound()
    println("animal sound")
  }
}
class Bird extends Animal{
  override def sound()={ //将Animal的方法重写
    print("bird sounds")
  }
}
class Moon {
//  def sound()={ //将Animal的方法重写
//    print("bird sounds")
//  }
}
